﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;

namespace QuocHoi_TV_Frontend.Models
{
    public static class UtilDate
    {
        #region DATETIME METHODS
        /// <summary>
        /// Kiểm tra xem chuỗi truyền vào có đúng format ngày tháng hay không
        /// </summary>
        public static bool IsDateFormat(string src)
        {
            try
            {
                DateTime.Parse(src);
                return true;
            }
            catch
            {
                return false;
            }
        }

        public static bool IsDateFormat(string src, string format)
        {
            try
            {
                DateTime.ParseExact(src, format, DateTimeFormatInfo.CurrentInfo);
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Lấy giá trị ngày tháng cho chuỗi truyền vào
        /// </summary>
        /// <returns></returns>
        public static DateTime ParseDate(string src)
        {
            try
            {
                return DateTime.Parse(src);
            }
            catch
            {
                return DateTime.MinValue;
            }
        }

        public static DateTime ParseDate(string src, string format)
        {
            try
            {
                return DateTime.ParseExact(src, format, DateTimeFormatInfo.CurrentInfo);
            }
            catch
            {
                return DateTime.MinValue;
            }
        }

        /// <summary>
        /// Chuyển một chuỗi có format ngày tháng thành format ngày tháng khác
        /// </summary>
        /// <returns></returns>
        public static string FixDateFormat(string src, string newformat)
        {
            DateTime d = ParseDate(src);
            if (Util.IsNull(d)) return "";
            return d.ToString(newformat);
        }

        public static string FixDateFormat(string src, string newformat, string obldformat)
        {
            DateTime d = ParseDate(src, obldformat);
            if (Util.IsNull(d)) return "";
            return d.ToString(newformat);
        }
        static public string FormatDateVN(DateTime D)
        {
            string ngay, thang, nam;
            string ngaythang;
            ngay = D.Day.ToString();
            thang = D.Month.ToString();
            nam = D.Year.ToString();
            ngaythang = DayOfWeekToVn(D.DayOfWeek.ToString()) + ", Ngày " + ngay + " tháng " + thang + " năm " + nam;
            return ngaythang;
        }
        static public string FormatDateMacth(DateTime D)
        {
            string ngay, thang;
            string ngaythang;
            ngay = D.Day.ToString();
            thang = D.Month.ToString();
            ngaythang = ngay + "/" + thang;
            return ngaythang;
        }
        static public string FormatTimeVN(DateTime D)
        {
            string Times;

            int nhours;
            nhours = int.Parse(D.Hour.ToString());
            if (nhours >= 12)
                Times = D.Hour.ToString() + ":" + D.Minute.ToString() + ":" + D.Second.ToString() + " Chiều ";
            else
                Times = D.Hour.ToString() + ":" + D.Minute.ToString() + ":" + D.Second.ToString() + " Sáng ";
            return Times;

        }
        
        static public string GetTimeSpan(DateTime d)
        {
            try
            {
                string strtime = "";
                string strtimespan = "Cập nhật ";
                TimeSpan ts = DateTime.Now.Subtract(d);
                string ngay = ts.Days.ToString();
                string gio = ts.Hours.ToString();
                string phut = ts.Minutes.ToString();
                string giay = ts.Seconds.ToString();
                int iday = 0;
                if (!int.TryParse(ngay, out iday))
                {
                    iday = 0;
                }
                if (ngay != "0")
                {
                    strtime += ngay + " ngày ";
                }
                if (gio != "0")
                {
                    strtime += gio + " giờ ";
                }
                if (iday == 0)
                {
                    if (phut != "0")
                    {
                        strtime += phut + " phút ";
                    }
                    if (giay != "0")
                    {
                        strtime += giay + " giây ";
                    }    
                }
                
                strtimespan = strtimespan + strtime + " trước.";
                return strtimespan;
            }
            catch (Exception)
            {
                return "";
            }

        }
        #endregion
       
        /// <summary>
        /// Returns the first day of the week that the specified date 
        /// is in. 
        /// </summary>
        public static DateTime GetFirstDayOfWeek(this DateTime sourceDateTime)
        {
            var daysAhead = (DayOfWeek.Sunday - (int)sourceDateTime.DayOfWeek);

            sourceDateTime = sourceDateTime.AddDays((int)daysAhead+1);

            return sourceDateTime;
        }
        public static DateTime GetLastDayOfWeek(this DateTime sourceDateTime)
        {
            var daysAhead = DayOfWeek.Saturday - (int)sourceDateTime.DayOfWeek ;

            sourceDateTime = sourceDateTime.AddDays((int)daysAhead +1);

            return sourceDateTime;
        }
        public static List<DateOfWeekItem> GetAlldayInWeek(DateTime Date)
        {
            List<DateOfWeekItem> lstdate = new List<DateOfWeekItem>();
            var startDate = GetFirstDayOfWeek(Date);
            var endDate = GetLastDayOfWeek(Date);
            var totalDays = 7;
            var results =
            from i in Enumerable.Range(0, totalDays)
            let d = startDate.AddDays(i)
            select new { Date = d };
            foreach (var item in results)
            {
                DateOfWeekItem dofw = new DateOfWeekItem();
                if (item.Date == Date)
                {
                    dofw.Active = true;
                }
                else { dofw.Active = false; }
                dofw.date = item.Date;
                dofw.NameDay = DayOfWeekToVn(item.Date.DayOfWeek.ToString());
                lstdate.Add(dofw);
            }
            return lstdate;
        }
        static public string DayOfWeekToVn(string dayName)
        {
            switch (dayName.ToLower())
            {

                case "monday":
                    return "Thứ 2";
                    break;

                case "tuesday":
                    return "Thứ 3";
                    break;

                case "wednesday":
                    return "Thứ 4";
                    break;

                case "thursday":
                    return "Thứ 5";
                    break;

                case "friday":
                    return "Thứ 6";
                    break;

                case "saturday":
                    return "Thứ 7";
                    break;

                case "sunday":
                    return "Chủ nhật";
                    break;
                default:
                    return "Chủ nhật";

            }

        }

    }
}